#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#define SIZE 10

void handler(int sig)
{
    return;
}

int main(void)
{
    //fork一个子进程
    pid_t fpid = fork();
    if (fpid == 0)
    {
        //获取父进程pid，即ppid
        pid_t ppid = getppid();
        //向父进程发送信号，标志子进程开始执行
        kill(ppid, SIGALRM);
        printf("**************子进程开始执行**************\n");

        printf("**************整合题目一**************\n");

        printf("**************写入file.txt**************\n");
        long pid = 0;
        pid = syscall(600);
        printf("执行结果: %ld\n", pid);

        printf("**************读取file.txt**************\n");
        pid = syscall(601);
        printf("执行结果: %ld\n", pid);

        printf("**************子进程结束执行**************\n");

        //向父进程发送信号，标志子进程结束执行
        kill(ppid, SIGALRM);
        return 0;
    }

    //printf("parent\n");
    float time_use = 0;
    struct timeval start;
    struct timeval end;
    //signal接收子进程发来的SIGNLRM信号
    //若没有接收到信号，那么select会阻塞父进程，
    //组织其继续运行,
    //若接收到信号，signal打断select的阻塞，
    //从而获得子进程运行开始时间及结束时间
    signal(SIGALRM, handler);
    select(0, NULL, NULL, NULL, NULL);
    gettimeofday(&start, NULL);

    select(0, NULL, NULL, NULL, NULL);
    gettimeofday(&end, NULL);
    //计算子进程运行时间，精度为微秒，单位为秒
    time_use = end.tv_sec - start.tv_sec + (float)(end.tv_usec - start.tv_usec) / 1000000;

    printf("子程序运行时间:%fs\n", time_use);

    return 0;
}